home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 27
/
CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso
/
CUCD
/
Utilities
/
mbackup
/
mbackup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-08-02
|
8KB
|
272 lines
/****h* MiniBackup/mbackup.c [1.20] *
*
* NAME
* mbackup.c
* COPYRIGHT
* $VER: mbackup.c 1.20 (02.08.98) © by Stefan Kost 1997-1998
* FUNCTION
* backups files according to a taskfile using lha
* AUTHOR
* Stefan Kost
* CREATION DATE
* 01.Aug.1998
* MODIFICATION HISTORY
* 02.Aug.1998 V 1.20 extended args
* 05.Jan.1998 V 1.10 stack-bugs fixed
* 28.May.1997 V 1.00 first release
* 19.May.1997 V 0.00 initial version
* NOTES
* requires lha to be in dos path
*******
*/
//-- includes -----------------------------------------------------------------
//-- Ansi
#include <dos.h>
#include <math.h>
#include <mffp.h> /* die entsprechenden Matheroutinen includen */
#include <mieeedoub.h>
#include <m68881.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//-- AmigaOS
#include <exec/types.h>
#include <cmacros.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#include <exec/exec.h>
#include <proto/dos.h> /* Prototypes für Libraryfunctions */
#include <proto/exec.h>
//-- Local
#include "project.h"
//-- DebugTools
#define DEBUG_SRCPATH "sc:source/tagtools/puttag/"
#include <debug/dt_decl.h>
//-- prototypes ---------------------------------------------------------------
char *_stroserror(int errornum);
void Error(STRPTR fmt,...);
ULONG seekdir(FILE *wf,char *path,char *pat,UBYTE mode,ULONG nr);
//-- globals ------------------------------------------------------------------
UBYTE *VersTag="\0$VER:"PRJ_VERS;
#define ARG_TEMPLATE "PATH/A,TASKFILE/A,COM=COMPLETE/S,INC=INCREMENTAL/S"
#define ARG_COUNT 4
#define ARGID_PATH 0
#define ARGID_TASKFILE 1
#define ARGID_COMPLETE 2
#define ARGID_INCREMENTAL 3
#define MODE_NONE 0
#define MODE_COMPLETE 1
#define MODE_INCREMENTAL 2
//-- externals ----------------------------------------------------------------
#pragma msg 72 ignore
extern long __near __stack=50000L; /* reseve more stackspace; used by startup-code */
#pragma msg 72 warning
//-- definitions --------------------------------------------------------------
char *stroserror(int errornum)
{
static char *deferr="unknown",*err;
long i=0;
err=deferr;
while(i!=-1 && __os_errlist[i].errnum)
{
if(__os_errlist[i].errnum==errornum)
{
err=__os_errlist[i].msg;i=-1;
}
else i++;
}
return(err);
}
void Error(STRPTR fmt,...)
{
va_list arglist;
char str[256];
int C_Error=errno;
long IOError=IoErr();
int OSError=_OSERR;
va_start(arglist,fmt);
printf(PRJ_NAME" : ");
vprintf(fmt,arglist);
if(C_Error) printf("\terrno : %s\n",strerror(C_Error));
if(OSError) printf("\toserr : %s\n",stroserror(OSError));
if(IOError) { Fault(IOError,"\tioerr ",str,255);printf("%s\n",str); }
va_end(arglist);
}
ULONG seekdir(FILE *wf,char *path,char *pat,UBYTE mode,ULONG nr)
{
struct FileLock *dirlock;
struct FileInfoBlock InfoBlock;
char newpath[256];
MSG2("files=%5ld scanning %s",nr,path);
if(dirlock=(struct FileLock *)Lock(path,SHARED_LOCK))
{
if(Examine((BPTR)dirlock,&InfoBlock))
{
if(InfoBlock.fib_DirEntryType>0 && InfoBlock.fib_DirEntryType!=3) // it's a directory but no link
{
while(ExNext((BPTR)dirlock,&InfoBlock))
{
strmfp(newpath,path,InfoBlock.fib_FileName);
if(InfoBlock.fib_DirEntryType<0) // it's a file
{
if(mode==MODE_COMPLETE) // if it matches the pattern then add to list
{
if(MatchPatternNoCase(pat,InfoBlock.fib_FileName)) { fprintf(wf,"%s\n",newpath);nr++; }
}
if(mode==MODE_INCREMENTAL) // if it has changed & matches the pattern then add to list
{
if(!(InfoBlock.fib_Protection&FIBF_ARCHIVE)) // file has changed
{
if(MatchPatternNoCase(pat,InfoBlock.fib_FileName)) { fprintf(wf,"%s\n",newpath);nr++; }
}
}
}
else nr=seekdir(wf,newpath,pat,mode,nr); // it's a directory
}
}
else printf("ERROR: %s is no directory\n",path);
}
UnLock((BPTR)dirlock);
}
return(nr);
}
int main(int argc,char *argv[])
{
struct RDArgs *rda;
LONG args[ARG_COUNT]={0};
char dest[256],ndate[20],odate[10],path[256],tpat[30],pat[100],cmdln[256];
time_t t;
struct tm *p;
UBYTE nday,oday,nmon,omon;
FILE *tf,*wf;
UBYTE mode=MODE_NONE; // default is - no backup
UBYTE force=FALSE; // default is - we check the date
ULONG nr=0;
int numRetVal=RETURN_OK;
REPORT_CALLS;
BREAK(PRJ_NAME" has been started");
if(rda=ReadArgs(ARG_TEMPLATE,args,NULL))
{
time(&t);p=localtime(&t); // get date & time
strftime(ndate,9,"%Y%m%d",p);ndate[9]=0;
strmfp(dest,(char *)args[ARGID_PATH],ndate);
if(args[ARGID_COMPLETE]) { force=TRUE;mode=MODE_COMPLETE; } // force complete backup
if(args[ARGID_INCREMENTAL]) { force=TRUE;mode=MODE_INCREMENTAL; } // force incremental backup
if(!force) // check date & time
{
if((wf=fopen("progdir:mbackup.last_backup","rb")))
{
fread(odate,9,1,wf);odate[9]=0;
fclose(wf);
nmon=(ndate[4]-48)*10+(ndate[5]-48);
omon=(odate[4]-48)*10+(odate[5]-48);
if(nmon>omon) mode=MODE_COMPLETE; // first backup in new month)
else
{
nday=(ndate[6]-48)*10+(ndate[7]-48);
oday=(odate[6]-48)*10+(odate[7]-48);
if(nday>=oday+7) mode=MODE_INCREMENTAL;
}
}
else mode=MODE_COMPLETE;
}
MSG1("force backup : %d",force);
MSG1("backup mode : %d",mode);
MSG1("backup date : %s",ndate);
if(mode)
{
if((wf=fopen("t:mbackup.tmp","wt")))
{
if((tf=fopen((char *)args[ARGID_TASKFILE],"rt")))
{
while(!feof(tf)) // build filelist
{
fscanf(tf,"%s %s",path,tpat);
if(ParsePatternNoCase(tpat,pat,100)>=0) nr=seekdir(wf,path,pat,mode,nr);
else printf("ERROR: Wrong pattern %s\n",pat);
}
fclose(tf);
fclose(wf);
MSG1("%d files to backup",nr);
if(nr>0) // if there are files to backup,
{ // invoke lha
if(mode==MODE_COMPLETE) sprintf(cmdln,"lha -it:mbackup.tmp -q -x -S a %sc\n",dest);
if(mode==MODE_INCREMENTAL) sprintf(cmdln,"lha -it:mbackup.tmp -q -x -S a %si\n",dest);
SystemTags(cmdln,SYS_Asynch,FALSE,SYS_Output,Output(),SYS_Input,Input());
}
DeleteFile("t:mbackup.tmp");
MSG("lha finished");
if(mode==MODE_COMPLETE) sprintf(cmdln,"%sc.lha",dest);
if(mode==MODE_INCREMENTAL) sprintf(cmdln,"%si.lha",dest);
if((tf=fopen(cmdln,"rt"))) // hat lha geklappt ?
{
fclose(tf);
MSG("now saving status");
if((wf=fopen("progdir:mbackup.last_backup","wb")))
{
time(&t);p=localtime(&t); // something is scrambling that field
strftime(ndate,9,"%Y%m%d",p);ndate[9]=0; // so I've to set this again
fwrite(ndate,9,1,wf);
fclose(wf);
}
if((wf=fopen("progdir:mbackup.log","at")))
{
strftime(ndate,20,"%d.%m.%Y",p);
if(mode==MODE_COMPLETE) fprintf(wf,"Complete backup on %s\n",ndate);
if(mode==MODE_INCREMENTAL) fprintf(wf,"Incremental backup on %s\n",ndate);
fclose(wf);
}
}
}
else
{
fclose(wf);
Error("open taskfile \"%s\"\n",args[ARGID_TASKFILE]);numRetVal=RETURN_ERROR;
}
}
else { Error("open workfile \"t:mbackup.tmp\"\n");numRetVal=RETURN_ERROR; }
}
FreeArgs(rda); // free args
}
else { printf("Usage : "PRJ_NAME" %s\n",ARG_TEMPLATE);numRetVal=RETURN_WARN; }
BREAK(PRJ_NAME" is ready");
REPORT_OFF;
return(numRetVal);
}
//-- eof ----------------------------------------------------------------------